# 列表是一个容器，里面可以存放各种各样的数据类型,列表允许重复值的存储
a = [1,2,34,"12",43,"我是你爹"]

# 访问元素，正序访问用对应下标，逆序访问使用-1
print(a)
print(a[1])
print(a[-1])

# 列表切片
# 列表访问特定区间内的元素
print(a[0:3])
print(a[:3])
print(a[:])
# 列表跨步访问元素
print(a[::2])
# 列表逆序输出
print(a[::-1])

# 列表的增删改查
# 默认增加
# append()  只能添加一个元素，末尾添加
# entend()  能够添加多个元素

# 切片添加
# a[len(a):] = [1,2,3]    也是末尾添加

# 插入操作——insert  insert(插入后的下标，插入的值)
a.insert(1,3)

# 删除元素——remove  待删除元素必须存在，如果存在多个，只会删除第一个
a.remove(1)
# 删除元素——pop 根据下标删除指定下标的元素
a.pop(1)
# 清空列表
a.clear()

# 改（替换）
b = [1,2,3,5]
# 使用切片进行单个替换或者批量替换
b[1] = 12
b[1:] = [1,2]
# 列表的简单排序
# a.sort()列表根据指定排序算法进行排序
# a.reverse()列表的反转

# 查找元素
b.count()   # 元素个数
b[b.index(1)] = 2  # 返回第一个该元素的下标
# arr_name.index(待查找元素,start,end)   两个可选参数，选择区间
# 拷贝列表
# arr_name.copy()  or  new_arr = arr_name[:]
# .copy()是一个浅拷贝，拷贝的只是引用地址，并不算真正意义上的拷贝

# 列表的加法和乘法
s = [1,2,3]
t = [4,5,6]
print(s+t)
# 列表加法就是将两个列表元素相加，形成一个新列表
print(s*3)
# 列表乘法就是将一个列表的元素重复n次

# 列表的嵌套——多维列表
matrix = [[1,2,3],[4,5,6],[7,8,9]]
for i in matrix:
    for each in i:
        print(each)
# for循环访问多维列表
# 使用下标索引多维列表元素和C语言一样

# 多维列表的循环创建
A = [0] * 3
for i in range(3):
    A[i] = [0] * 3
print(A)

# 列表推导式
abc = [1,2,3,4,5]
abc = [i * 2 for i in abc]
print(abc)
# 列表推导式的效率非常的高
# 基本结构[expression for target in iterable]
# 列表推导式默认转换为列表，实现字符串、集合到列表的快速转换
# 列表推导式会重新生成一个列表来存储表达式的结果

# 列表推导式来创建多维列表
matrix = [[i] * 3 for i in range(3)]
print(matrix)
# 列表推导式添加筛选条件
even = [i for i in range(10) if i % 2 == 0]
print(even)

# 列表推导式的嵌套
matrix = [[1,2,3],[4,5,6],[7,8,9]]
# 通过列表推导式实现多维列表的降维操作
result = [col for row in matrix for col in row]
# 列表推导式的语法执行顺序除了expression外从左往右依次执行，添加if语句也是如此






